package com.kaithan.gateway.exception;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.exception.SaTokenException;
import com.kaithan.framework.common.exception.MyException;
import com.kaithan.framework.common.vo.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 类描述：全局异常捕获处理器
 *
 * @author ZhuYin
 * @since 2024年12月25日
 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理自定义异常
     */
    @ExceptionHandler(value = MyException.class)
    @ResponseBody
    public ResultVO<?> myExceptionHandler(MyException e) {
        log.error("自定义异常：code={}, message={} ", e.getCode() == null ? 500 : e.getCode(), e.getMessage());
        return ResultVO.getError(e.getCode(), e.getMessage());
    }

    /**
     * 方法说明：处理sa-token相关的异常
     *
     * @param e 异常
     * @return 返回包装后的异常信息
     * @author ZhuYin
     * @since 2024年12月26日
     */
    @ExceptionHandler(value = SaTokenException.class)
    @ResponseBody
    public ResultVO<?> saTokenExceptionHandler(Exception e) {
        log.error("sa-token校验异常：{}", e.getMessage());
        String msg = e.getMessage();
        if (e instanceof NotLoginException) {
            if (e.getMessage().contains("：")) {
                msg = e.getMessage().substring(0, e.getMessage().indexOf("："));
            }
        } else if (e instanceof NotRoleException) {
            msg = "无此角色权限";
        } else if (e instanceof NotPermissionException) {
            msg = "无此权限";
        }
        return ResultVO.getError(401, msg);
    }

}
